class Queue {
    constructor() {
        this.items = []
    }
    //enqueue(element): 向队列尾部添加一个（或多个）新的项
    enqueue(element) {
        this.items.push(element)
    }
    //dequeue(): 移除队列中的第一项 （即排在队列最前面的）项，并返回被移出的元素
    dequeue() {
        return this.items.shift()
    }
    //front(): 返回队列中第一个元素--最先被添加，也是最先被移出的元素。队列不做任何变动
    front() {
        if(this.isEmpty() === 0) return null;
        return this.items[0]
    }
    //isEmpty(): 空队列返回true 否则返回false
    isEmpty() {
        return this.items.length === 0
    }
    //size(): 返回队列包含的元素个数，与数组length很像
    size() {
        return this.items.length
    }
}

//优先级队列

class QueueElement {//构造函数，构造器进行
    constructor(element, priority) {
        this.element = element;
        this.priority = priority;
    }
}

class PriorityQueue extends Queue{
  enqueue(element, priority) {
    //1.创建QueueElement对象
    const queueElement = new QueueElement(element, priority);
    //2.考虑如何插入新的元素
    if(this.isEmpty()) {//判断数组是否为空
        this.items.push(queueElement)//插入
    }else {
        let added = false;
        for(let i = 0; i < this.size(); i++) { 
            if(this.items[i].priority > queueElement.priority) {//进行比较，依次与数组priority进行对比，当对比到大于他的时候，放在该数组前面
                this.items.splice(i, 0, queueElement);//在指定位置插入queueElement元素
                added = true;   //最后都没有进入if语句，证明数据priority优先级最高，added不改变
                break;
            }
        }
        if(!added) {//当added没改变时，取反为true并push进入数组
            this.items.push(queueElement);
        }
    }
  }
}

//击鼓传花算法
function passGame(nameList, num) {
    //1.先创建一个队列并且赋值
    const queue = new Queue()
    for(let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
    }
    //2.循环让这些人进入队列中
    while(queue.size() > 1) {
        for(let i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue())
        }

        queue.dequeue()
    }

    return queue.front()
}